package com.xj.driver.mqtt.subscriber.domain;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * @author sunzhenzhen
 */
@Slf4j
@Data
public class StationSwitchManager {
    // 主用站点编号
    public static final String PRIMARY_STATION_NO = "A";
    //备用站点编号
    public static final String SECONDARY_STATION_NO = "B";

    // 配置参数
    private static final long HEARTBEAT_TIMEOUT_MS = 400000; // 400秒超时
    private static final long SWITCH_COOLDOWN_MS = 60000; // 60秒切换冷却时间

    // 设备状态跟踪
    private final ConcurrentHashMap<String, Long> lastHeartbeatTimes;
    private volatile String activeStationNo;
    private final AtomicBoolean isSwitching;
    private volatile long lastSwitchTime;

    public StationSwitchManager() {
        this.lastHeartbeatTimes = new ConcurrentHashMap<String, Long>() {{
            put(PRIMARY_STATION_NO, 0L);
            put(SECONDARY_STATION_NO, 0L);
        }};
        this.activeStationNo = PRIMARY_STATION_NO;
        this.isSwitching = new AtomicBoolean(false);
        this.lastSwitchTime = 0L;
    }

    /**
     * 更新设备心跳时间
     */
    public void updateHeartbeat(String stationNo) {
        lastHeartbeatTimes.put(stationNo, System.currentTimeMillis());
        log.debug("收到设备[{}]的心跳", stationNo);
    }

    /**
     * 检查设备是否存活
     */
    public boolean isStationAlive(String stationNo) {
        Long lastHeartbeat = lastHeartbeatTimes.get(stationNo);
        return lastHeartbeat != null &&
                (System.currentTimeMillis() - lastHeartbeat) < HEARTBEAT_TIMEOUT_MS;
    }

    /**
     * 判断是否应该检查切换
     */
    public boolean shouldCheckSwitch() {
        return System.currentTimeMillis() - lastSwitchTime > SWITCH_COOLDOWN_MS;
    }

    /**
     * 切换到指定设备
     */
    public void switchToStation(String newStationNo) {
        if (isSwitching.compareAndSet(false, true)) {
            try {
                log.warn("主备切换: 从[{}]切换到[{}]", activeStationNo, newStationNo);
                activeStationNo = newStationNo;
                lastSwitchTime = System.currentTimeMillis();
            } finally {
                isSwitching.set(false);
            }
        }
    }

    /**
     * 获取当前活跃设备
     */
    public String getActiveStationNo() {
        return activeStationNo;
    }

    /**
     * 检查并执行切换
     */
    public void checkAndSwitch() {
        if (isSwitching.get() || !shouldCheckSwitch()) {
            return;
        }

        // 检查当前活跃设备是否在线
        if (!isStationAlive(activeStationNo)) {
            /*将通讯管理机A和B的健康状态推送给Kafka*/

            // 查找其他可用设备
            for (String stationNo : lastHeartbeatTimes.keySet()) {
                if (!stationNo.equals(activeStationNo) && isStationAlive(stationNo)) {
                    switchToStation(stationNo);
                    onStationSwitched(stationNo);
                    break;
                }
            }
        }
    }

    /**
     * 设备切换回调
     */
    private void onStationSwitched(String newStationNo) {
        log.info("已切换到设备: {}", newStationNo);
        // 这里可以添加切换后的回调逻辑

    }
}
